package Java基础.IO流.how2j;

import org.junit.jupiter.api.Test;

import java.io.*;

/**
 * Created by didi on 18/01/2018.
 */
public class _3字节流 {
    /**
     * 磁盘文件存放ASCLL码,但是按照字节读取.
     */
    @Test
    void test1读取磁盘文件() {
        try {
            //内容是ab，对应的ASCII分别是97 98
            File f = new File("resources/ascll");
            //创建基于文件的输入流
            FileInputStream fis = new FileInputStream(f);
            //创建字节数组，其长度就是文件的长度
            byte[] all = new byte[(int) f.length()];
            //以字节流的形式读取文件所有内容
            fis.read(all);
            for (byte b : all) {
                //打印出来是97 98
                System.out.println(b);
            }
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    void test2写入到磁盘文件() {
        try {
            // 准备文件emptyfile其中的内容是空的
            File f = new File("resources/emptyfile");
            // 准备长度是2的字节数组，用88,89初始化，其对应的字符分别是X,Y
            byte data[] = {88, 89};
            // 创建基于文件的输出流
            FileOutputStream fos = new FileOutputStream(f);
            // 把数据写入到输出流
            fos.write(data);
            // 关闭输出流
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 练习-写入数据到多级目录下的文件.
     * > 目录可能不存在
     */
    @Test
    void practice1() {
        try {
            File f = new File("resources/tmp1/tmp2/afile");
            //首先获取文件所在的目录
            File dir = f.getParentFile();

            //如果该目录不存在，则创建该目录
            if (!dir.exists()) {
                //  dir.mkdir(); //使用mkdir会抛出异常，因为该目录的父目录也不存在
                dir.mkdirs(); //使用mkdirs则会把不存在的目录都创建好
            }
            byte data[] = {88, 89};
            FileOutputStream fos = new FileOutputStream(f);
            fos.write(data);

            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 练习-拆分文件
     * # 题意
     * 找到一个大于40byte的文件，按照20byte为单位，拆分成多个子文件并编号，并且以编号作为文件名结束。
     */
    @Test
    void practice2() {
        File f = new File("resources/fileForDivided.bat");
        try {
            FileInputStream fis = new FileInputStream(f);
            byte[] buf = new byte[20];

            int newNum = (int) f.length() / 20 + 1;
            for (int i = 0  ; i<newNum ; i++) {
                fis.read(buf, 0, buf.length);//YC: off表示缓冲区buf的偏移,表示从缓冲区buf的哪里开始写. //len: 表示写多少个byte到缓冲区中.
                File newFile = new File(f.getParent() + File.separator + "divided" + File.separator + "fileForDivided" + "-" + i + ".bat");
                System.out.println(newFile);
                newFile.getParentFile().mkdir();
                newFile.createNewFile();
                FileOutputStream fos = new FileOutputStream(newFile);
                fos.write(buf);
                fos.close();
            }
            fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
